/**
 ******************************************************************************
 * @file           : heading_diff_ctrl_c.cpp
 * @author         : wangyingjie
 * @brief          : None
 * @attention      : None
 * @date           : 2025/5/23
 ******************************************************************************
 */

#ifndef HEADING_DIFF_CTRL_H
#define HEADING_DIFF_CTRL_H

//#ifdef __cplusplus
//extern "C"
//{
//#endif

#include "control/pid/studio_pid_c.h"
#include "geography/studio_proj_c.h"
#include "geometry/studio_geo_algo_c.h"

//#ifdef __cplusplus
//}
//#endif

// 测试使用

//#include "geometry/studio_geo_utils.h"
//#include "geometry/studio_geo_algo.h"

// 测试使用结束

// 小船控制结构体
typedef struct
{
    studio_pid heading_pid;  // 方位角PID控制器
    studio_pid speed_pid;  // 方位角PID控制器
    studio_point_c target;   // 目标点
    double base_throttle;    // 基础油门
    double left_throttle;    // 左侧油门
    double right_throttle;   // 右侧油门
} diff_ctrl;

// 初始化小船控制器
void init_diff_ctrl(diff_ctrl *controller,
                    const studio_point_c *target,
                    double base_throttle,  // 输入范围0~1.0
                    double Kp,
                    double Ki,
                    double Kd);

void reset_diff_ctrl_goal(diff_ctrl *controller, const studio_point_c *target);

// 正确计算最短路径误差（返回-180~180°）
double calculate_heading_error(double target_deg, double current_deg);

double update_boat(diff_ctrl *controller, const studio_point_c *current_pos, double current_heading_deg);

void simulate_movement(studio_point_c *current_pos, double *current_heading, double left_throttle, double right_throttle);


#endif  // HEADING_DIFF_CTRL_H